/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.jy.springbootcmsservice.modules.gen.entity;

import com.jy.springbootcmsservice.common.base.entity.DataEntity;
import com.jy.springbootcmsservice.common.utils.StringUtils;
import com.jy.springbootcmsservice.modules.gen.utils.GenUtils;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 业务表Entity
 * @author tm
 * @version 2020-11-23
 */
@Data
public class Table extends DataEntity<Table> {

	/**
	 * 名称
	 */
	private String name;
	/**
	 * 描述
	 */
	private String comments;
	/**
	 * 实体类名称
	 */
	private String className;
	/**
	 * 关联父表
	 */
	private String parentTable;
	/**
	 * 关联父表外键
	 */
	private String parentTableFk;

	/**
	 * 表列
	 */
	private List<TableColumn> tableColumnList = new ArrayList<>();

	/**
	 * 按名称模糊查询
	 */
	private String nameLike;

	/**
	 * 当前表主键列表
	 */
	private List<String> pkList;

	/**
	 * 父表对象
	 */
	private Table parent;
	/**
	 * 子表列表
	 */
	private List<Table> childList = new ArrayList<>();
	
	public Table() {
		super();
	}

	public Table(String id){
		super(id);
	}

	/**
	 * 获取列名和说明
	 * @return
	 */
	public String getNameAndComments() {
		return getName() + (comments == null ? "" : "  :  " + comments);
	}

	/**
	 * 获取导入依赖包字符串
	 * @return
	 */
	public List<String> getImportList(){
		// 引用列表
		List<String> importList = new ArrayList<>();
		for (TableColumn tableColumn : getTableColumnList()){
			if (tableColumn.getIsNotBaseField() || ("1".equals(tableColumn.getIsQuery()) && "between".equals(tableColumn.getQueryType())
							&& ("createDate".equals(tableColumn.getSimpleJavaField()) || "updateDate".equals(tableColumn.getSimpleJavaField())))){
				// 导入类型依赖包， 如果类型中包含“.”，则需要导入引用。
				if (StringUtils.indexOf(tableColumn.getJavaType(), ".") != -1 && !importList.contains(tableColumn.getJavaType())){
					importList.add(tableColumn.getJavaType());
				}
			}
			if (tableColumn.getIsNotBaseField()){
				// 导入JSR303、Json等依赖包
				for (String ann : tableColumn.getAnnotationList()){
					if (!importList.contains(StringUtils.substringBeforeLast(ann, "("))){
						importList.add(StringUtils.substringBeforeLast(ann, "("));
					}
				}
			}
		}
		// 如果有子表，则需要导入List相关引用
		if (getChildList() != null && getChildList().size() > 0){
			if (!importList.contains(GenUtils.LIST_JAVA_TYPE)){
				importList.add(GenUtils.LIST_JAVA_TYPE);
			}
			if (!importList.contains(GenUtils.GOOGLE_LIST_JAVA_TYPE)){
				importList.add(GenUtils.GOOGLE_LIST_JAVA_TYPE);
			}
		}
		return importList;
	}
	
	/**
	 * 是否存在父类
	 * @return
	 */
	public Boolean getParentExists(){
		return parent != null && StringUtils.isNotBlank(parentTable) && StringUtils.isNotBlank(parentTableFk);
	}

	/**
	 * 是否存在create_date列
	 * @return
	 */
	public Boolean getCreateDateExists(){
		for (TableColumn c : tableColumnList){
			if ("create_date".equals(c.getName())){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 是否存在update_date列
	 * @return
	 */
	public Boolean getUpdateDateExists(){
		for (TableColumn c : tableColumnList){
			if ("update_date".equals(c.getName())){
				return true;
			}
		}
		return false;
	}

	/**
	 * 是否存在del_flag列
	 * @return
	 */
	public Boolean getDelFlagExists(){
		for (TableColumn c : tableColumnList){
			if ("delete_flag".equals(c.getName())){
				return true;
			}
		}
		return false;
	}
}


